//タイムラインコンストラクタ
function createTlView(i_elem,i_param)
{
	var msgq=new Array();
	var ret=new ReactiveListH(
		i_elem,i_param);
	var wait=0;
	//ReadLog
	var rlog=new ReadLogList();

	/**
	 * テキスト文字列をツイッタータイムラインHtmlへ変換する。
	 */
	function parseStatus(i_text)
	{
		function addTagHref(s)
		{
			var URLEXP="#[-_a-zA-Z0-9]+";
			var src=s;
			var ret="";
			var reg=new RegExp(URLEXP,"ig");
			var a=reg.exec(src);
			for(;a!=null;){
				ret+=src.substr(0,a.index);
				ret+="<a href=\"javascript:app.openWindow('http://twitter.com/#!/search?q=%23"+a[0].substring(1)+"')\">"+a[0]+"</a>";
				src=src.substring(a.index+a[0].length);
				reg=new RegExp(URLEXP,"ig");
				a=reg.exec(src);
			}
			ret+=src;
			return ret;
		}
		var URLEXP="(http|ftp):\/\/[-_.!~*¥'()a-zA-Z0-9;¥/?:¥@&=+¥$,%#]+";
		var src=i_text;
		var ret="";
		var out_urllist=new Array();
		var reg=new RegExp(URLEXP,"ig");
		var a=reg.exec(src);
		for(;a!=null;){
			ret+=addTagHref(src.substr(0,a.index));
			ret+="<a href=\"javascript:app.openWindow('"+a[0]+"')\">"+a[0]+"</a>";
			src=src.substring(a.index+a[0].length);
			reg=new RegExp(URLEXP,"ig");
			a=reg.exec(src);
		}
		ret+=addTagHref(src);
		return {html:ret,list:out_urllist};
	}	
	function addStatus(i_s)
	{
		function url2ImgUrl(i_url)
		{
			if(i_url.indexOf("http://twitpic.com") == 0) {
				//twipic
				return "http://twitpic.com/show/thumb/" + i_url.substr(i_url.lastIndexOf("/") + 1);
			}else if(i_url.indexOf("http://yfrog.com") == 0){
				// yfrog
				return i_url + ".th.jpg";
			}else if(i_url.indexOf("http://plixi.com/p/") == 0){
				// plixi
				return "http://api.plixi.com/api/TPAPI.svc/imagefromurl?size=small&url=" + i_url;
			}
			return null;
		}		
		var s;
		
		switch(i_s._type)
		{
			case 0:
				var sname=i_s.user.screen_name;
				var st=parseStatus(i_s.text);
				s=
				"<div class='row'>"+
				"<div>"+
					"<img class='icon' src='"+i_s.user.profile_image_url+"'/>"+
					"<div class='title'>"+
						"<a href=\"javascript:app.openWindow('http://twitter.com/#!/"+sname+"')\">"+
							"<span class='sname'>"+sname+"</span>"+
						"</a>"+
						"<span class='name'>"+i_s.user.name+"</span><br/>"+
						"<span class='time'></span>"+
					"</div>"+
				"</div>"+
				"<div class='text'>"+st.html+"</div>"+
				(function(){
					if(st.list.length<1){
						return "";
					}
					var ret="<div class='imgs'>";
					for(var i=0;i<st.list.length;i++){
						var url=url2ImgUrl(st.list[i]);
						if(url!=null){
							ret+="<a href='javascript:app.openWindow(\""+st.list[i]+"\")'><img class='img' src='"+url+"'/></a>";
						}
					}
					ret+="</div>";
					return ret;
				}())+
				
				
				"</div>";
				break;
			case 1:
				if(i_s.num>0){
					s="<div class='trow'><span class='ttitle'>"+i_s.title+"</span><span class='ttext'>["+nowStr()+"] - "+i_s.num+"件のステータスを表示しました。 </span></div>";
				}
				break;
		}
		if(s==undefined){
			return;
		}
		//再生したら読込ポイントの記録
		var rl=rlog.getItemByListId(i_s._lid);
		if(rl.sid<i_s.id){
			rl.sid=i_s.id;
		}
		ret.addItem(s);
	}
	ret.onEndAnimation=function()
	{
		wait++;
		//メッセージキューにあれば追加
		if(wait>20 && msgq.length>0){
			wait=0;
			addStatus(msgq.shift());
			//残りのタイムライン数が変わる。
		}
		if(wait>10 && msgq.length==0){
			return false;
		}
		return true;
	}
	ret.pushTimeLine=function(i_tl,i_title,i_lid)
	{
		//リストIDの読み込みログを得る。
		var log=rlog.getItemByListId(i_lid);
		//追記対象のステータスを集める。
		var tl=new Array();
		for(var i=0;i<i_tl.length;i++)
		{
			if(log.sid>=i_tl[i].id){
				continue;//古いのは何もしない
			}
			tl.push(i_tl[i]);
		}
		//追記処理
		for(var i=0;i<tl.length;i++)
		{
			tl[i]._type=0;
			tl[i]._lid=i_lid;
			msgq.push(tl[i]);
		}
		//タイトル行
		msgq.push({_type:1,title:i_title,time:0,num:tl.length});
		if(!this.isStart()){
			addStatus(msgq.shift());
			//残りのタイムライン数が変わる。
		}
	}
	//停止
	ret.stopRun=function()
	{
		this.killTimer();
	}
	//リストIDごとに何処までロードしたかをキャッシュする。
	
	return ret;
};
function ReadLogList()
{
	function LogItem(i_lid,i_sid)
	{
		this.lid=i_lid;this.sid=i_sid;
	}
	var l=new Array();
	this.getItemByListId=function(i_lid)
	{
		for(var i=0;i<l.length;i++){
			if(l[i].lid==i_lid)
			{
				return l[i];
			}
		}
		var n=new LogItem(i_lid,0);
		l.push(n);
		return n;
	}
}
/**
 * googleMap関係
 */
function GAMap(i_id)
{
	var _t=this;
	this._mymap=new google.maps.Map(document.getElementById(i_id), {
		  zoom: 8,
		  center: new google.maps.LatLng(36.0, 139.0),
		  mapTypeId: google.maps.MapTypeId.ROADMAP,
		  scaleControl: true,
		  scrollwheel: true
		 });/*
	var _COLOR=['#00ff00','#0000ff'];
	this.addArea=function(d,i_depth)
	{
		var myLatLng = new google.maps.LatLng(d.la,d.ln);
		var circle=new google.maps.Circle({
			center: myLatLng,       // 中心点(google.maps.LatLng)
			fillColor:_COLOR[i_depth],   // 塗りつぶし色
			fillOpacity: 0.25,       // 塗りつぶし透過度（0: 透明 ⇔ 1:不透明）
			map:_t._mymap,             // 表示させる地図（google.maps.Map）
			radius: d.r*1000,        // 半径（ｍ）
			strokeColor:_COLOR[i_depth], // 外周色
			strokeOpacity: 0.25,     // 外周透過度（0: 透明 ⇔ 1:不透明）
			strokeWeight: 1         // 外周太さ（ピクセル）
			});
		// マップクリックイベントを追加  
		google.maps.event.addListener(circle, 'click',function(e){_t.onClick(e,d)});
		google.maps.event.addListener(circle, 'mousemove',function(e){_t.onMouseMove(e,d)});
	}*/
}

function installLrApp(i_interval,i_tag_ids)
{
	var _t=installApp("lr");
	
	var s=new ScriptAjax(i_tag_ids.ajax);
	var map=new GAMap(i_tag_ids.map);
	_t.tl=createTlView(
		gElemById(i_tag_ids.tl),
		{ares:3,amin:1,aint:50,emax:50});
	
	app=_t;
	//1.タイマーでタイムラインを取りに行く。
	//取ってきたタイムラインのIDで、未来の物だけを追加する。
	var timer_id=null;
	var current_user,current_lid,current_lname;
	function updateTl()
	{
		s.load("/app/js_rawlisttl.jsp?name="+current_user+"&id="+current_lid+"&cb=app.jsCallBack");
	}
	function startUpdate(i_interval)
	{
		time_id=setInterval(updateTl,i_interval);
	}
	_t.jsCallBack=function(i_data)
	{
		_t.tl.pushTimeLine(i_data,current_lname,current_lid);
	}
	/*現在のuidとlidを設定する。*/
	_t.setCurrentList=function(i_user,i_lname,i_lid)
	{
		current_user=i_user;
		current_lid=i_lid;
		current_lname=i_lname;
	}
	_t.openWindow=function(i_url)
	{
		window.open(i_url,_t.appname);
	}
	
	
	_t.setCurrentList("area_japan_lr","にゃんこ万歳",40347863);
	updateTl();
	startUpdate(i_interval);
	return _t;
}
